package com.example.service.consumer.controller;



import com.example.common.dto.TestDto;
import com.example.common.vo.TestVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;

import javax.lang.model.element.VariableElement;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;


/**
 *  0.url上的所有参数都是以String解析的，如果要传入对应类型
 *  1.默认的Content-Type是 application/json
 *  2.当传入或者返回的参数是一个List<Bean泛型>的复杂形式时，要使用exchange
 *  3.请求参数Class<T> responseType和ParameterizedTypeReference<T>
 *      responseType都是用来指定返回数据的类型的，对于简单类型的用Class<T>就可以了，但是如果返回类型太过复杂（如对象嵌套之类的）
 *      可以用ParameterizedTypeReference<T>来指定返回类型。
 *  3.可变参数Object... uriVariables和Map<String, ?>。
 *      uriVariables里面传的参数都是url上的参数，本质上没有什么区别，重点是url上一定要占位。
 */
@RestController
@RequestMapping("/rpc")
public class RPCController {

    /**
     * 调用方式：
     * 1. 通过http://ip:端口/....服务
     * 2. 通过http://eureka的服务名/...指定的服务
     */
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/test")
    public TestDto rpcTest(TestDto dto){
        return dto;
    }


    @GetMapping("/get/noArg")
    public TestVo rpcNoArgGet(){
        ResponseEntity<TestVo> responseResult = restTemplate.getForEntity("http://127.0.0.1:8080/service/get/noArg",
                TestVo.class);
        return responseResult.getBody();
    }


//    @GetMapping("/get/urlArgAndBodyArg")
//    public TestVo rpcUrlArgAndBodyArgGet(){
//        HashMap<String, Object> uriMap = new HashMap<>();
//        uriMap.put("name","name参数");
//        uriMap.put("age",1235678);
//        ResponseEntity<TestVo> responseResult = restTemplate.getForEntity("http://127.0.0.1:8080/service/get/urlArgAndBodyArg/{name}/{age}",
//                TestVo.class,uriMap);
//        return responseResult.getBody();
//    }


    @GetMapping("/post/objArg")
    public TestVo rpcObjArgPost(){
        ResponseEntity<TestVo> responseResult = restTemplate.postForEntity("http://127.0.0.1:8080/service/post/objArg",
                new TestDto().setName("dtoName"), TestVo.class);
        return responseResult.getBody();
    }


    @GetMapping("/post/urlArgAndBodyArg")
    public TestVo rpcUrlArgAndBodyArgPost(){
//        HttpHeaders httpHeaders = new HttpHeaders();
//        //设置我们请求体的内容格式
//        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
//        httpHeaders.setAccept(new ArrayList<>(Arrays.asList(MediaType.APPLICATION_JSON)));
//        HttpEntity<TestDto> entity = new HttpEntity<>(new TestDto().setAge(123456),httpHeaders);
        HashMap<String, Object> uriMap = new HashMap<>();
        uriMap.put("name","abc");
        uriMap.put("age","123123");

        ResponseEntity<TestVo> responseResult = restTemplate.postForEntity("http://127.0.0.1:8080/service/post/urlArgAndBodyArg/{name}/{age}",
                new TestDto().setName("body"), TestVo.class,uriMap);
        return responseResult.getBody();
    }



    @GetMapping("/delete/noArg")
    public TestVo rpcObjArgDelete() {
        //相当于get
        restTemplate.delete("http://127.0.0.1:8080/service/delete/noArg");
        return null;
    }

    @GetMapping("/put/objArg")
    public TestVo rpcObjArgPut() {
        //相当于post
        restTemplate.put("http://127.0.0.1:8080/service/put/objArg",new TestDto().setName("putDto"));
        return null;
    }

    //文件无法处理
    @PostMapping("/post/MultipartFile")
    public TestVo rpcMultipartFilePost(MultipartFile file){
        ResponseEntity<TestVo> responseResult = restTemplate.postForEntity("http://127.0.0.1:8080/service/post/MultipartFile",
                file, TestVo.class);
        return responseResult.getBody();
    }
}
